//
//  SXUserAccountViewModel.swift
//  sina
//
//  Created by shengxinwei on 16/5/23.
//  Copyright © 2016年 shengxinwei. All rights reserved.
//

import UIKit
import SVProgressHUD

private let userInfoKey = "com.jianshu.userInfoKey"

class SXUserAccountViewModel: NSObject {
    //创建单例对象
    static let sharedAccount: SXUserAccountViewModel = SXUserAccountViewModel()
    //创建模型属性
    var userAccount: SXUserAccount?
    
    private override init() {
        
        super.init()
        userAccount = loadUserAccount()
        
    }
    
    //通过一判断用户是否登录的计算型属性 来解决 每次都需要判断的问题
    //计算型属性 每次调用都会执行
    var userLogin: Bool {
        
        if userAccount?.expires_date?.compare(NSDate()) == .OrderedDescending {
            return true
        }
        
        //如果过期  需要将 userAccount 设置为 nil
        userAccount = nil
        return false
    }
    
    
    //返回头像图片
    var headUrl: NSURL? {
        return NSURL(string: userAccount?.avatar_large ?? "")
    }
}

extension SXUserAccountViewModel {
    
    
    func loadToken(codeNo: String,finished: (isSuccess: Bool) -> ()) {
        
        SXNetworkTools.sharedTools.loadAccessToken(codeNo) { (responseObject, error) in
            if error != nil{
                print("无网络\(error)")
                return
            }
            
            //根据请求回来的数据,获取用户信息
            self.loadUserInfo(responseObject, finished: finished)
        }
    }
    
    //获取用户信息
    private func loadUserInfo(responese: AnyObject? , finished: (isSuccess: Bool) -> ()) {
        //guard 判断条件是否成立 ,如果不成立直接return 或者break
        guard let result = responese as? [String: AnyObject] else {
            SVProgressHUD.showErrorWithStatus("没网络,看着办吧")
            finished(isSuccess: false)
            return
        }
        
        SXNetworkTools.sharedTools.loadUserInfo(result) { (responseObject, error) in
            if error != nil {
                print("无网络...")
                finished(isSuccess: false)
                return
            }
            //请求成功
            guard var dict = responseObject as? [String : AnyObject] else {
                //                SVProgressHUD.showErrorWithStatus("世界上最遥远的距离就是没有网")
                finished(isSuccess: false)
                return
            }
            
            //用户信息  就应该保存用户信息到本地
            //合并两个字典 统一保存用户数据到本地
            for (key, value) in result {
                dict[key] = value
            }
            
            //这段代码被移动到 分类中进行封装处理
            self.saveUserAccount(dict)
            finished(isSuccess: true)
            
        }
    }
}

//存储数据的操作
extension SXUserAccountViewModel {
    //对数据进行存储
    func saveUserAccount(dict: [String: AnyObject]) {
        
        //将字典转化为模型,过滤不需要的数据
        let account =  SXUserAccount.init(dict: dict)
        //给单例对象赋值
        self.userAccount = account
        
        let keys = ["access_token","expires_in","uid","name","avatar_large","expires_date"]
        //将模型转化为字典
        let userInfo = account.dictionaryWithValuesForKeys(keys)
        //将字典保存到偏好设置中
        let userDef = NSUserDefaults.standardUserDefaults()
        //存入本地
        userDef.setObject(userInfo, forKey: userInfoKey)
        //同步
        userDef.synchronize()
        
        //打印沙盒路径,--查看
        print(NSHomeDirectory())
        
    }
    
    //获取数据  减少这个方法调用 希望只执行一次
    func loadUserAccount() -> SXUserAccount? {
        //如果使用 as! 在偏好设置并没有保存数据的时候 程序会崩溃
        //频繁读取磁盘中数据 磁盘IO 性能不高 并且影响磁盘的寿命
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String : AnyObject] else {
            //防止没有存储数据的时候 程序崩溃的问题
            return nil
        }
        
        //字典转模型
        //再次判断用户的token是否过期
        
        return SXUserAccount(dict: dict)
    }
}
